package com.edu.exam.entity.grading;

import com.edu.exam.enums.grading.DraftStatus;
import com.edu.exam.enums.grading.DraftType;
import jakarta.persistence.*;
import lombok.AllArgsConstructor;
import lombok.Builder;
import lombok.Data;
import lombok.NoArgsConstructor;
import org.springframework.data.annotation.CreatedDate;
import org.springframework.data.annotation.LastModifiedDate;
import org.springframework.data.jpa.domain.support.AuditingEntityListener;

import java.time.LocalDateTime;

/**
 * 成绩草稿实体类
 * 所属模块：B-06 成绩管理模块
 *
 * <p>成绩草稿实体用于存储成绩录入的临时数据，支持临时保存和恢复功能。
 * 包含草稿基本信息、内容管理、状态控制、过期处理等。确保用户录入数据的安全性和连续性。</p>
 *
 * <p>核心功能：
 * - 草稿存储：存储成绩录入的临时数据
 * - 状态管理：管理草稿的保存、编辑、提交等状态
 * - 过期控制：自动处理过期草稿的清理
 * - 内容管理：支持JSON格式的草稿内容存储
 * - 版本控制：支持草稿的版本管理</p>
 *
 * @author 系统生成
 * @version 1.0
 * @since 2025-11-10
 */
@Data
@Builder
@NoArgsConstructor
@AllArgsConstructor
@Entity
@EntityListeners(AuditingEntityListener.class)
public class GradeDraft {

    /**
     * 主键ID
     */
    @Id
    @GeneratedValue(strategy = GenerationType.IDENTITY)
    private Long id;

    /**
     * 用户ID
     *
     * <p>草稿所属用户的唯一标识符。</p>
     */
    @Column(name = "user_id", nullable = false, length = 50)
    private String userId;

    /**
     * 草稿名称
     *
     * <p>用户自定义的草稿名称，便于识别和管理。</p>
     */
    @Column(name = "draft_name", nullable = false, length = 100)
    private String draftName;

    /**
     * 草稿内容
     *
     * <p>草稿的具体内容，JSON格式存储。</p>
     */
    @Column(name = "draft_content", nullable = false, columnDefinition = "LONGTEXT")
    private String draftContent;

    /**
     * 草稿状态
     * <p>草稿的当前状态。
     * 支持的状态：ACTIVE（活跃）、EDITING（编辑中）、SUBMITTING（提交中）、SUBMITTED（已提交）、FAILED（失败）、EXPIRED（已过期）、DELETED（已删除）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "status", nullable = false, length = 20)
    private DraftStatus status = DraftStatus.ACTIVE;

    /**
     * 过期时间
     *
     * <p>草稿的过期时间，超过此时间自动清理。</p>
     */
    @Column(name = "expire_time", nullable = false)
    private LocalDateTime expireTime;

    /**
     * 课程ID
     *
     * <p>草稿关联的课程ID。</p>
     */
    @Column(name = "course_id", length = 50)
    private String courseId;

    /**
     * 班级ID
     *
     * <p>草稿关联的班级ID。</p>
     */
    @Column(name = "class_id", length = 50)
    private String classId;

    /**
     * 学生数量
     *
     * <p>草稿中包含的学生数量。</p>
     */
    @Column(name = "student_count")
    private Integer studentCount;

    /**
     * 已录入数量
     *
     * <p>草稿中已录入的学生数量。</p>
     */
    @Column(name = "entered_count")
    private Integer enteredCount;

    /**
     * 完成度
     *
     * <p>草稿的完成度百分比。</p>
     */
    @Column(name = "completion_rate", precision = 5, scale = 2)
    private java.math.BigDecimal completionRate;

    /**
     * 草稿类型
     * <p>草稿的类型标识。
     * 支持的类型：GRADE_ENTRY（成绩录入）、BATCH_IMPORT（批量导入）、AUTO_IMPORT（自动导入）</p>
     */
    @Enumerated(EnumType.STRING)
    @Column(name = "draft_type", length = 20)
    private DraftType draftType = DraftType.GRADE_ENTRY;

    /**
     * 草稿版本
     *
     * <p>草稿的版本号，用于版本控制。</p>
     */
    @Column(name = "draft_version", length = 20)
    private String draftVersion = "1.0";

    /**
     * 最后访问时间
     *
     * <p>草稿最后被访问的时间。</p>
     */
    @Column(name = "last_access_time")
    private LocalDateTime lastAccessTime;

    /**
     * 访问次数
     *
     * <p>草稿被访问的次数统计。</p>
     */
    @Column(name = "access_count", nullable = false)
    private Integer accessCount = 0;

    /**
     * 自动保存标志
     *
     * <p>是否为自动保存的草稿。</p>
     */
    @Column(name = "is_auto_saved", nullable = false)
    private Boolean isAutoSaved = false;

    /**
     * 草稿标签
     *
     * <p>JSON格式的草稿标签，用于分类和过滤。</p>
     */
    @Column(name = "draft_tags", columnDefinition = "TEXT")
    private String draftTags;

    /**
     * 草稿备注
     *
     * <p>草稿的备注信息。</p>
     */
    @Column(name = "draft_notes", columnDefinition = "TEXT")
    private String draftNotes;

    /**
     * 数据来源
     *
     * <p>草稿数据的来源标识。</p>
     */
    @Column(name = "data_source", length = 100)
    private String dataSource;

    /**
     * 原始文件名
     *
     * <p>如果草稿来自文件导入，记录原始文件名。</p>
     */
    @Column(name = "original_file_name", length = 255)
    private String originalFileName;

    /**
     * 提交任务ID
     *
     * <p>如果草稿已提交，关联的任务ID。</p>
     */
    @Column(name = "submission_task_id", length = 50)
    private String submissionTaskId;

    /**
     * 失败原因
     *
     * <p>如果草稿提交失败，记录失败原因。</p>
     */
    @Column(name = "failure_reason", columnDefinition = "TEXT")
    private String failureReason;

    /**
     * 草稿大小
     *
     * <p>草稿内容的字节大小。</p>
     */
    @Column(name = "draft_size_bytes")
    private Long draftSizeBytes;

    /**
     * 压缩内容
     *
     * <p>压缩后的草稿内容，用于存储优化。</p>
     */
    @Column(name = "compressed_content", columnDefinition = "LONGTEXT")
    private String compressedContent;

    /**
     * 是否压缩
     *
     * <p>草稿内容是否已压缩。</p>
     */
    @Column(name = "is_compressed", nullable = false)
    private Boolean isCompressed = false;

    // ===== 审计字段 =====

    /**
     * 创建时间
     */
    @CreatedDate
    @Column(name = "create_time", nullable = false, updatable = false)
    private LocalDateTime createTime;

    /**
     * 更新时间
     */
    @LastModifiedDate
    @Column(name = "update_time", nullable = false)
    private LocalDateTime updateTime;

    /**
     * 创建用户ID
     */
    @Column(name = "create_user_id", length = 50)
    private String createUserId;

    /**
     * 更新用户ID
     */
    @Column(name = "update_user_id", length = 50)
    private String updateUserId;

    /**
     * 是否删除
     */
    @Column(name = "is_deleted", nullable = false)
    private Boolean isDeleted = false;

    /**
     * 删除时间
     */
    @Column(name = "delete_time")
    private LocalDateTime deleteTime;

    /**
     * 删除用户ID
     */
    @Column(name = "delete_user_id", length = 50)
    private String deleteUserId;

    // ================================
    // 枚举迁移完成
    // ================================
    // DraftStatus和DraftType枚举已成功迁移到com.edu.exam.enums.grading包
    // 使用@Enumerated(EnumType.STRING)注解进行JPA映射

}
